package com.gy.concurrent.mode.producercustomer;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class Provider implements Runnable {

	// 共享缓存区
	private BlockingQueue<Data> queue;

	// 多线程间是否启动变量，有强制从主内存中刷新的功能，即时返回线程状态
	private volatile boolean isRunning = true;

	// id生成器
	private static AtomicInteger count = new AtomicInteger();

	// 随机对象
	private static Random r = new Random();

	public Provider(BlockingQueue<Data> queue) {
		this.queue = queue;
	}

	@Override
	public void run() {
		while (isRunning) {
			try {
				// 随机休眠0-1000毫秒表示获取数据（产生数据的耗时）
				Thread.sleep(r.nextInt(1000));
				// 获取的数据进行累积
				int id = count.incrementAndGet();
				// 比如通过一个getData方法获取了
				Data data = new Data(id, "数据" + id);
				System.out.println("当前线程：" + Thread.currentThread().getName() + "，获取了数据，id为：" + id + "，进行装在到公共缓存区中...");
				if (!this.queue.offer(data, 2, TimeUnit.SECONDS)) {// 两秒钟内没有添加进去即返回false
					System.out.println("提交缓冲区数据失败...");
					// do something... 比如重新提交
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public void stop() {
		this.isRunning = false;
	}

}